home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Utilities / Unix / skey / src / skeysh.c < prev    next >
C/C++ Source or Header  |  1995-04-15  |  3KB  |  130 lines

  1. /* S/KEY v1.1b (skeysh.c)
  2.  *
  3.  * Authors:
  4.  *          Neil M. Haller <nmh@thumper.bellcore.com>
  5.  *          Philip R. Karn <karn@chicago.qualcomm.com>
  6.  *          John S. Walden <jsw@thumper.bellcore.com>
  7.  *          Scott Chasin <chasin@crimelab.com>
  8.  *
  9.  * S/Key authentication shell
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <pwd.h>
  15.  
  16. char userbuf[16] = "USER=";
  17. char homebuf[128] = "HOME=";
  18. char shellbuf[128] = "SHELL=";
  19. char pathbuf[128] = "PATH=:/usr/ucb:/bin:/usr/bin";
  20. char *cleanenv[] = { userbuf, homebuf, shellbuf, pathbuf, 0, 0 };
  21. char *shell = "/bin/csh";
  22.  
  23. char *getenvr();
  24.  
  25. extern char **environ;
  26. struct passwd *pwd;
  27.  
  28. main (argc, argv)
  29.   int argc;
  30.   char *argv[];
  31. {
  32.   int stat, pid;
  33.   char user [8];
  34.  
  35.   if ((pwd = getpwuid(getuid())) == NULL) {
  36.       fprintf(stderr, "Who are you?\n");
  37.       exit(1);
  38.   }
  39.  
  40.   strcpy(user, pwd->pw_name);
  41.  
  42.   if ((pwd = getpwnam(user)) == NULL) {
  43.       fprintf(stderr, "Unknown login: %s\n", user);
  44.       exit(1);
  45.   }
  46.  
  47.   stat = skey_haskey (user);
  48.  
  49.   if (stat == 1) {
  50.      fprintf(stderr,"keysh: no entry for user %s.\n", user);
  51.      exit (-1);
  52.   }
  53.  
  54.   if (stat == -1) {
  55.      fprintf(stderr, "keysh: could not open key file.\n");
  56.      exit (-1);
  57.   }
  58.  
  59.   if (skey_authenticate (user) == -1) {
  60.       printf ("Invalid response.\n");
  61.       exit (-1);
  62.   } 
  63.  
  64.   if (setgid(pwd->pw_gid) < 0) {
  65.       perror("keysh: setgid");
  66.       exit(3);
  67.   }
  68.  
  69.   if (initgroups(user, pwd->pw_gid)) {
  70.       fprintf(stderr, "keysh: initgroups failed\n");
  71.       exit(4);
  72.   }
  73.  
  74.   if (setuid(pwd->pw_uid) < 0) {
  75.       perror("keysh: setuid");
  76.       exit(5);
  77.   }
  78.  
  79.   cleanenv[4] = getenvr("TERM");
  80.   environ = cleanenv;
  81.  
  82.   setenv("USER", pwd->pw_name, userbuf);
  83.   setenv("SHELL", shell, shellbuf);
  84.   setenv("HOME", pwd->pw_dir, homebuf);
  85.  
  86.   if (chdir(pwd->pw_dir) < 0) {
  87.       fprintf(stderr, "No directory\n");
  88.       exit(6);
  89.   }
  90.  
  91.   execv (shell, argv);
  92.   fprintf(stderr, "No shell\n");
  93.   exit(7);
  94. }
  95.  
  96. setenv (ename, eval, buf)
  97. char *ename, *eval, *buf;
  98. {
  99.   register char *cp, *dp;
  100.   register char **ep = environ;
  101.  
  102.   /*
  103.    * this assumes an environment variable "ename" already exists
  104.    */
  105.    while (dp = *ep++) {
  106.        for (cp = ename; *cp == *dp && *cp; cp++, dp++)
  107.             continue;
  108.        if (*cp == 0 && (*dp == '=' || *dp == 0)) {
  109.             strcat(buf, eval);
  110.             *--ep = buf;
  111.             return;
  112.        }
  113.    }
  114. }
  115.  
  116. char *getenvr(ename)
  117. char *ename;
  118. {
  119.   register char *cp, *dp;
  120.   register char **ep = environ;
  121.  
  122.   while (dp = *ep++) {
  123.          for (cp = ename; *cp == *dp && *cp; cp++, dp++)
  124.               continue;
  125.          if (*cp == 0 && (*dp == '=' || *dp == 0))
  126.               return (*--ep);
  127.   }
  128.   return ((char *)0);
  129. }
  130.